home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / front.lha / front / src / Tokens.mi < prev    next >
Text File  |  1992-08-18  |  7KB  |  264 lines

  1. (* handle token section *)
  2.  
  3. (* $Id: Tokens.mi,v 2.2 1992/08/07 15:13:51 grosch rel $ *)
  4.  
  5. (* $Log: Tokens.mi,v $
  6.  * Revision 2.2  1992/08/07  15:13:51  grosch
  7.  * allow several scanner and parsers; extend module Errors
  8.  *
  9.  * Revision 2.1  1991/11/21  14:47:50  grosch
  10.  * new version of RCS on SPARC
  11.  *
  12.  * Revision 2.0  91/03/08  18:26:43  grosch
  13.  * turned tables into initialized arrays (in C)
  14.  * moved mapping tokens -> strings from Errors to Parser
  15.  * changed interface for source position
  16.  * 
  17.  * Revision 1.1  90/06/11  18:45:48  grosch
  18.  * layout improvements
  19.  * 
  20.  * Revision 1.0     88/10/04  14:27:26  vielsack
  21.  * Initial revision
  22.  * 
  23.  *)
  24.  
  25. IMPLEMENTATION MODULE Tokens;
  26.  
  27. FROM Lists    IMPORT MakeList, tList;
  28. FROM Strings    IMPORT tString, ArrayToString;
  29. FROM StringMem    IMPORT tStringRef;
  30. FROM TokenTab    IMPORT Vocabulary,PosType;
  31. FROM Memory    IMPORT Alloc;
  32. FROM Idents    IMPORT tIdent;
  33. FROM SYSTEM    IMPORT ADR, TSIZE;
  34. FROM TokenTab    IMPORT Terminal, MakeDefTerm,MakeTerm,CompleteDefTerm,TokenError;
  35. FROM Errors    IMPORT eFatal, eError, eIdent, eString, eInternal, ErrorMessageI;
  36. FROM Positions    IMPORT NoPosition;
  37.  
  38.   CONST
  39.     eTokenDeclTwice    = 30;
  40.     eCodeExists        = 31;
  41.  
  42.   TYPE
  43.     Declarations = POINTER TO Declaration;
  44.  
  45.     Declaration = RECORD
  46.     Token      : tIdent;
  47.     TokenPos  : PosType;
  48.     CASE HasCoding : BOOLEAN OF
  49.       TRUE:
  50.         EQUALPos  : PosType;
  51.         NumberPos : PosType;
  52.     END;
  53.     Comment      : tList;
  54.     CommPos      : PosType;
  55.     Next      : Declarations;
  56.       END;
  57.  
  58.   VAR
  59.     TokensVars :
  60.       RECORD
  61.     GlobalComment: tList;
  62.     GlobalCommPos: PosType;
  63.     TOKENPos     : PosType;
  64.     TOKENComment : tList;
  65.     TOKENCommPos : PosType;
  66.       END;
  67.     
  68.     StartDecl : Declarations;
  69.     RDecl : Declarations;
  70.     WDecl : Declarations;
  71.     ReadyForReading : BOOLEAN;
  72.  
  73.   PROCEDURE  MakeGlobalHeader
  74.     ( GlobalComment : tList;
  75.       GlobalCommPos : PosType);
  76.   
  77.   BEGIN
  78.     TokensVars.GlobalComment := GlobalComment; 
  79.     TokensVars.GlobalCommPos := GlobalCommPos;
  80.   END MakeGlobalHeader;
  81.  
  82.  
  83.   PROCEDURE  MakeTokensHeader
  84.     ( TOKENPos        : PosType;
  85.       TOKENComment  : tList;
  86.       TOKENCommPos  : PosType);
  87.   
  88.   (* Speichert globale Informationen ueber den zu TOKEN gehoerigen
  89.      Abschnitt *)
  90.  
  91.   BEGIN
  92.     TokensVars.TOKENPos         := TOKENPos;
  93.     TokensVars.TOKENComment  := TOKENComment;
  94.     TokensVars.TOKENCommPos  := TOKENCommPos;  
  95.   END MakeTokensHeader;
  96.  
  97.  
  98.   PROCEDURE MakeDeclaration
  99.     (Token    : tIdent;
  100.      TokenPos    : PosType; 
  101.      HasCoding    : BOOLEAN;
  102.      EQUALPos    : PosType;
  103.      Number    : Terminal;
  104.      NumberPos    : PosType;
  105.      Comment    : tList;
  106.      CommPos    : PosType);
  107.   
  108.   (* Fuege neue Deklaration ein *)
  109.  
  110.   VAR HDecl : Declarations;
  111.       Error : TokenError;
  112.  
  113.   BEGIN
  114.     IF ReadyForReading THEN
  115.       ERROR ('MakeDeclaration: do not write');
  116.     END;
  117.     HDecl := Alloc(TSIZE(Declaration));
  118.     IF HDecl = NIL THEN
  119.       ERROR ('MakeDeclaration: Heap overflow');
  120.     END;
  121.     HDecl^.Token       := Token;
  122.     HDecl^.TokenPos    := TokenPos;
  123.     HDecl^.HasCoding   := HasCoding;
  124.     HDecl^.Next           := NIL;
  125.     IF HasCoding THEN
  126.       MakeTerm(Token,Number,Error,TokenPos);
  127.       IF Error = SymbolExists THEN
  128.     ErrorMessageI (eTokenDeclTwice,eError,TokenPos,eIdent, ADR (Token));
  129.     RETURN;
  130.       ELSIF Error = CodeExists THEN
  131.     ErrorMessageI (eCodeExists,eError,TokenPos,eIdent,ADR(Token));
  132.     RETURN;
  133.       END;
  134.       HDecl^.EQUALPos  := EQUALPos;
  135.       HDecl^.NumberPos := NumberPos;
  136.     ELSE
  137.       MakeDefTerm(Token,Error,TokenPos);
  138.       IF Error = SymbolExists THEN
  139.     ErrorMessageI(eTokenDeclTwice,eError,TokenPos,eIdent,ADR(Token));
  140.     RETURN;
  141.       END;
  142.     END;
  143.     HDecl^.Comment     := Comment;
  144.     HDecl^.CommPos     := CommPos;
  145.     IF WDecl = NIL THEN
  146.       (* Einfuegen des ersten Elementes *)
  147.       StartDecl := HDecl;
  148.     ELSE
  149.       WDecl^.Next := HDecl;
  150.     END;
  151.     WDecl := HDecl;
  152.   END MakeDeclaration;
  153.  
  154.  
  155.   PROCEDURE CompleteDeclarations;
  156.  
  157.   VAR Error : TokenError;
  158.  
  159.   BEGIN
  160.     RDecl := StartDecl;
  161.     WHILE RDecl <> NIL DO
  162.       IF NOT RDecl^.HasCoding THEN
  163.     CompleteDefTerm(RDecl^.Token,Error);
  164.     IF Error = NotExists THEN
  165.       ERROR ('CompleteDeclarations: token does not exists');
  166.     ELSIF Error = CodeExists THEN
  167.       ERROR ('CompleteDeclarations: token already complete');
  168.     ELSIF Error = NotTerm  THEN
  169.       ERROR ('CompleteDeclarations: token is nonterminal');
  170.     END;
  171.       END;
  172.       RDecl := RDecl^.Next;
  173.     END;
  174.     RDecl := StartDecl;
  175.     ReadyForReading := TRUE;
  176.   END CompleteDeclarations;
  177.  
  178.  
  179.   PROCEDURE  GetGlobalHeader
  180.     (VAR GlobalComment : tList;
  181.      VAR GlobalCommPos : PosType);
  182.  
  183.   (* liest die mit MakeGlobalHeader abgelegte Information *)
  184.  
  185.   BEGIN
  186.     GlobalComment := TokensVars.GlobalComment; 
  187.     GlobalCommPos := TokensVars.GlobalCommPos;
  188.   END GetGlobalHeader;
  189.  
  190.  
  191.   PROCEDURE  GetTokensHeader
  192.     (VAR TOKENPos      : PosType;
  193.      VAR TOKENComment  : tList;
  194.      VAR TOKENCommPos  : PosType);
  195.  
  196.   (* liest die mit MakeTokensHeader abgelegte Information *)
  197.  
  198.   BEGIN
  199.     TOKENPos      := TokensVars.TOKENPos;
  200.     TOKENComment  := TokensVars.TOKENComment;
  201.     TOKENCommPos  := TokensVars.TOKENCommPos;  
  202.   END GetTokensHeader;
  203.  
  204.    
  205.   PROCEDURE GetDeclaration
  206.     (VAR Token        : tIdent;
  207.      VAR TokenPos   : PosType; 
  208.      VAR HasCoding  : BOOLEAN;
  209.      VAR EQUALPos   : PosType;
  210.      VAR NumberPos  : PosType;
  211.      VAR Comment    : tList;
  212.      VAR CommPos    : PosType) : BOOLEAN ;
  213.   
  214.   (* liefert die naechste Deklaration, falls vorhanden. Ansonsten wird
  215.      FALSE zurueckgegeben.  *)
  216.  
  217.   BEGIN
  218.     IF NOT ReadyForReading THEN
  219.       ERROR ('GetDeclaration: do not read');
  220.     END;
  221.     IF RDecl = NIL THEN
  222.       RETURN FALSE;
  223.     ELSE
  224.       Token      := RDecl^.Token;
  225.       TokenPos      := RDecl^.TokenPos;
  226.       HasCoding      := RDecl^.HasCoding;
  227.       IF HasCoding THEN
  228.     EQUALPos  := RDecl^.EQUALPos;
  229.     NumberPos := RDecl^.NumberPos;
  230.       ELSE
  231.     EQUALPos.Line     := 0;
  232.     EQUALPos.Column     := 0;
  233.     NumberPos.Line     := 0; 
  234.     NumberPos.Column := 0; 
  235.       END;
  236.       Comment := RDecl^.Comment;
  237.       CommPos := RDecl^.CommPos;
  238.       RDecl   := RDecl^.Next;
  239.       RETURN TRUE;
  240.     END;
  241.   END GetDeclaration;
  242.  
  243.   PROCEDURE ERROR (a: ARRAY OF CHAR);
  244.   VAR s: tString;
  245.   BEGIN
  246.     ArrayToString (a, s);
  247.     ErrorMessageI (eInternal, eFatal, NoPosition, eString, ADR (s));
  248.   END ERROR;
  249.  
  250. BEGIN
  251.   StartDecl := NIL;  (* Anker fuer Declaration *)
  252.   WDecl        := NIL;  (* Schreibzeiger *)
  253.   RDecl        := NIL;  (* Lesezeiger    *)
  254.   ReadyForReading := FALSE;
  255.   WITH TokensVars DO
  256.     MakeList (GlobalComment);
  257.     GlobalCommPos.Line := 0;
  258.     GlobalCommPos.Column := 0;
  259.     MakeList (TOKENComment);
  260.     TOKENCommPos.Line := 0;
  261.     TOKENCommPos.Column := 0;
  262.   END;
  263. END Tokens.
  264.